with Ada.Strings.Unbounded;
use Ada.Strings.Unbounded;
with Ada.Strings.fixed;
use Ada.Strings.Fixed;
with Ada.Text_IO;
use Ada.Text_IO;
with Ada.Integer_Text_Io;
use Ada.Integer_Text_Io;
with Ada.Strings;
use Ada.Strings;
with Ada.Strings.Unbounded.Text_Io;
package body Fileparser is

   -- Global variabel som definerar den maximala längden för en linje.
   Max_Line : Integer := 50;

   package Us renames Ada.Strings.Unbounded;
 --  package Us_Put renames Ada.Strings.Unbounded.Text_Io;

   -- Funktion för att ta bort mellanslag ur en unbounded_string.
   -- Inparameter: Unbounded_string som man vill ta bort mellanslag från.
   -- Returvärde: Ny unbounded string som motsvarar inparameterna utan mellanslag.
   function Trim_Ws(Item : in Unbounded_String) return Unbounded_String is
      Str : String(1..Length(Item));
      Str2 : String(1..Length(Item));
      Ones, Zeros : Integer;
      Counter : Integer := 1;
   begin
      Ones := Us.Count(Item, "1");
      Zeros := Us.Count(Item, "0");
      Str := To_String(Item);
      for I in Str'Range loop
         if Str(I) /= ' ' then
            Str2(Counter) := Str(I);
            Counter := Counter +1;
         end if;
      end loop;
      return To_Unbounded_String(Str2(1..(Ones+Zeros)));
   end Trim_Ws;

   -- Funktion som tar in en filpekare pekad till en öppnad fil för inläsning.
   -- Funktionen returnerar en array av Unbounded_string där varje element i arrayen är
   -- ett färdigformatterat
   -- Formatterad för att skickas som ett figure meddelande.
   -- F # dimension details
   function Parse_Figure_From_File(File : in File_Type) return US_arr20 is
      Char_Counter, index : Integer;
      Line_String : String(1..50);
      Output : Us_Arr20;
   begin
      Index := 0;
      while not End_Of_File(File) loop
         Get_Line(File, Line_String, Char_Counter);
         if Line_String(1) = '#' then
            Index := Index + 1;
            Output(Index) := "F "
              & To_Unbounded_String(Line_String(9..Char_Counter));
         elsif Line_String(1..3) = "Dim" then
            Output(Index) := Output(Index)
              & " "
              & To_Unbounded_String(Line_String(13..Char_Counter))
              & " ";
         else
            Output(Index) := Output(Index)
              & Trim_Ws(To_Unbounded_String(Line_String(1..Char_Counter)));
         end if;
      end loop;
      return Output;
   end Parse_Figure_From_File;

   -- Function för att läsa in delbeskrivningsfil och formattera innehållet till ett meddelande
   -- som följer protokollet.
   -- Inparameter: Filpekar som pekar på den fil som skall användas.
   -- Returvärde: En unbounded_string formatterade för att följa protokollet.
   -- D # dimension details...
   function Parse_Parts_From_File(File : in File_Type) return Unbounded_String is
      Char_Counter, Parts_Counter : Integer;
      Output : Unbounded_String;
      Line_String : String(1..Max_Line);
   begin
      Parts_Counter := 0;
      while not End_Of_File(File) loop
         Get_Line(File, Line_String, Char_Counter);
          if Line_String(1) = '#' then
             Parts_Counter := Parts_Counter +1;
          elsif Line_String(1..3) = "Dim" then
             Output := Output & " " & To_Unbounded_String(Line_String(13..Char_Counter)) & " ";
          else
             Output := Output & Trim_Ws(To_Unbounded_String(Line_String(1..Char_Counter)));
          end if;
      end loop;

       Output := "D" & Integer'Image(Parts_Counter)  & Output;
       return Output;
   end Parse_Parts_From_File;

end Fileparser;

